BUUCTF [极客大挑战 2019]Secret File1

信息收集 抓包

提示很明显,我们找到secr3t.php

不想当脚本小妹,所以要仔细研究代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>

详解

error_reporting(0);:这个函数用于设置PHP的错误报告级别。参数0表示关闭所有错误报告,即使PHP执行过程中出现错误,也不会在浏览器上显示任何错误信息。这在生产环境中常用来避免泄露敏感信息。

1
2
3
4
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
  1. strstr($file, "../")strstr()函数用于查找字符串中是否包含指定的子字符串,返回第一次匹配到的位置。如果在$file中找到了"../"(即试图进行目录遍历的字符串),它会返回true

  2. stristr($file, "tp")stristr()函数与strstr()类似,但是它忽略大小写。这里它用来检查$file中是否包含"tp",这可能是一个恶意文件名或路径的一部分。

  3. stristr($file, "input"):同样的,检查文件名中是否包含"input",这是防止恶意文件名中可能包含的危险字符串。

  4. stristr($file, "data"):检查文件名中是否包含"data",防止潜在的文件名为data的文件被包含,data可能是一个敏感数据文件。

  5. if(...){...}:如果上述任何检查条件为真(即文件名包含了这些危险的字符串),就会执行echo "Oh no!";,输出一条错误信息,告诉用户输入的文件不合法,并使用exit()终止脚本执行。exit()会停止脚本执行,防止继续处理文件包含操作。

即不要包含目录穿越<../>注入恶意文件文件包含thinkphp框架漏洞

解法一 通解日志包含

1.把user-agent的内容改为马,然后访问日志文件,链接蚁剑

原理

nginx的日志文件会包含以下内容

字段 示例值 含义
客户端IP地址 192.168.1.100 访问者的IP地址
用户身份验证信息 - 通常为空(用于HTTP认证)
远程用户名(HTTP认证) - 通常为空
时间 [09/Feb/2025:14:32:10 +0800] 访问的时间(本地时区)
请求方法 "GET" HTTP请求方法,如GETPOST
访问的URL "/index.php" 访问的资源路径
HTTP版本 "HTTP/1.1" 请求使用的HTTP协议版本
状态码 200 HTTP响应状态码(200表示成功,404表示未找到)
响应大小(字节) 1024 响应的字节数,不包含HTTP头部
Referer(来源页面) "https://example.com" 访问者从哪个页面跳转过来的
User-Agent(客户端标识) "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" 访问者使用的浏览器或爬虫信息

但有时即使改掉了user-agent也不会在日志中显示,可能是以下原因

image-20250209192900146****

此时可以直接在url中写入马,本题没有过滤可以直接写

虽然页面会出错,但是仍然会被记录进日志

然后顺利的链接蚁剑

image-20250209191326528.png

解法二 伪协议

过滤条件很简单,直接伪协议也可以

image-20250209193748916.png解码后得flag{43f1f81f-8bcf-4ce8-9160-4a617b007e62}